如何获取目标软件的Docker镜像
1、服务相关术语
术语 | 介绍 | 备注 |
镜像 | 类似于操作系统的快照,比如ghost系统光盘。 | 若无特殊说明,都是指Docker镜像 |
DockerFile | 制作Docker镜像的描述文件 |
2、Docker容器
Docker 出现之前,你要安装一个软件,你需要下载软件包,下载该软件所的库文件,编译,安装,配置,最终让该软件跑起来。一旦中间有个步骤出错,还需从头再来。本来想搞业务,却不得不先面对各种环境调试安装,痛苦之处可想而知。
而用了 Docker 之后,你只需要pull一个镜像,run一个容器,你的软件就跑起来。所有的依赖,都在镜像里帮你做好了,你完全不用care这个软件怎么安装的,只需要会用就行了。
Docker容器技术使得应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
它可以很好的解决测序软件的各种版本运行在各种环境下的问题。比如,同一个VM上同时运行两个不同版本的GATK软件。这在传统的VM模型中是不具备的,这就给基因测序构建复杂业务场景,提供了便捷性。因为环境如果损坏,可以通过容器技术,轻松的恢复。
2.1、Docker容器镜像
Docker镜像和Docker容器的关系,就像软件和进程的关系。跑起来叫容器,还没跑的文件叫镜像。
一个Docker镜像是运行一个软件所需要所有依赖的最小集。并不需要将整个OS系统放入镜像,所以Docker镜像相比VM镜像,会小很多。
2.2 如何获取一个软件对应的Docker镜像
要获取一个软件对应的Docker镜像,并不一定需要自己制作。有很多方式来获得一个Docker镜像:
首先就是从DockerHub仓库搜索
然后可以Google搜索一下软件名+docker关键字,也许会有Github仓库收录
再不然可以自己制作,自己制作镜像又分两个门派。快照派 vs DockerFile派
最后就是求助华为容器镜像团队,协助帮忙制作啦。
下面我们分别介绍各个方法。
3、从DockerHub搜索
作为全球最大的Docker镜像中心,DockerHub网站提供了40万+的各类软件的公开Docker镜像下载,并以每周5K的速度在持续增长。所以除了是你自己开发的软件,一般都可以在这里找到对应的镜像版本。https://hub.docker.com/
举例来说,我们需要 bwa软件的镜像,可以搜索得到:
选择需要的软件版本就可以了。
PS:有以下几类软件,我们推荐从DockerHub获取,而不是自己制作的。
3.1 基础运行OS环境
像Ubuntu,Suse,Centos等这类基础OS类的镜像,我们建议直接从DockerHub获取官方认证版的。
3.2 基础编程语言类
像Java,Python,R语言,Golang等这类基础编程语言类的镜像,我们也建议直接从DockerHub获取官方认证版的。
3.3 基础通用类软件
像Tomcat,Mysql,Ngnix等这类常见的通用类的软件,我们也建议直接从DockerHub获取官方认证版的。
4、从Google搜索
基础运行OS环境虽然DockerHub可以搜索解决80%软件的问题。不过有些软件如果位于第三方的镜像仓库中,我们可以通过Google搜索来查找相关镜像。只需要把软件名加上docker关键就可以。比如:
可以看到,一般排第一个的也就是DockerHub仓库。
5、自己制作Docker镜像
自己制作Docker镜像,主要有两种:
找一个干净的基础镜像,比如Ubuntu,然后登陆系统里面把软件安装上。然后整体打个快照,就拥有了想要的软件的Docker镜像。这个就跟Ghost光盘一样。
第二种就是把软件安装的流程写成DockerFile,使用Docker build构建。
两个的构建原理是一样的,可以理解为第二种是对第一种的自动化。
5.1 打快照方式获得镜像(偶尔制作的镜像)
示例图如上,具体操作:
找一台主机,安装好Docker
启动一个空白的基础容器,并进入容器。比如启动一个 CentOS的容器。docker run -it centos.
执行安装任务。敲你平常敲的那些
退出容器。exit:退出容器
给刚才的容器,打个快照。docker commit -m "xx" -a "tsj" container-id tsj/image:tag
-a : 提交的镜像作者;
container-id : 刚才跑命令的容器id。可以使用 docker ps -a 查询得到;
-m : 提交时的说明文字;
tsj/image:tag : 仓库名/镜像名:TAG名
最后通过 docker images 查看得到的Docker镜像。
5.2 Dockerfile方式构建(经常更新的镜像)
上一步做镜像的方法,如果后续镜像都不变化,还行。如果经常要换(比如某个软件更新版本),那么你打镜像得累死。因为每变一次你就得重新执行那么多命令。
这时就需要使用自动化打镜像的方法。
就是把第一种打镜像的方法,用文件写出来(这个文件叫做DockerFile)。 然后执行:
docker build -t tsj/image:tag
命令,它就自动完成镜像制作了。
简单的DockerFile举例:
#Version 1.0.1
FROM centos:latest
MAINTAINER ***u "***u@163.com"
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN yum update -y
RUN yum install -y java
#使用&&拼接命令
RUN touch test.txt && echo "abc" >>abc.txt
#对外暴露端口
EXPOSE 80 8080 1038
#添加文件
ADD abc.txt /opt/
#添加文件夹
ADD /webapp /opt/webapp
#添加网络文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#设置环境变量
ENV WEBAPP_PORT=9090
#设置工作目录
WORKDIR /opt/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数
CMD ["-a", "-l"]
#设置卷
VOLUME ["/data", "/var/www"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt
详细的可以参考:https://docs.docker.com/engine/reference/builder/
或者《华为云容器仓库SWR 最佳实践》
5.3 DockerFile基本语法
这里给出一些基础的信息
FROM:
指定待扩展的父级镜像(基础镜像)。除了注释以外,在文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerefile文件中创建多个镜像。
MAINTAINER:
声明创建的镜像的作者信息。用户名、邮箱。非必须。
RUN:
用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来对的指令会在新的镜像上继续执行。RUN 语句有两种形式:
RUN yum update:是在/bin/sh环境中执行的指令的命令
RUN ["yum", "update"]:直接使用系统调用exec来执行行。
RUN yum update && yum install nginx:使用&&符号将多条命令连接在同一条RUN语句中。
EXPOSE:
用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。运行容器时,通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,其他容器或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p(小写)参数将Dockerfile中EXPOSE中没有列出的端口设置成公开的。
ADD:
向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以使一个文件夹。
•第一个参数:源文件(夹)。如果是相对路径,它必须是相对于Dockerfile所在目录的相对路径。如果是URL,会先下载下来,再添加到镜像里去。
•第二个参数:目标路径。如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。
VOLUME:
在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍热可以访问。
WORKDIR:
为接下来执行的指令指定一个新的工作目录,这个目录可以使绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。
ENV:
设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...
CMD:
用来设置启动容器时默认运行的命令。
ENTRYPOINT:
与CMD类似,也是用来指定容器启动时的默认运行的命令。区别在于:运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。
• ENTRYPOINT [ "ls", "-l"]
• docker run centos ==> docker run centos ls -l
• docker run centos -a ==> docker run centos ls -l -a
• 我们在运行容器的时候可以通过--entrypoint来覆盖Dockerfile中的指定:docker run gutianlangyu/test --entrypoint echo "hello world"
USER:
为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
ONBUILD:
触发器指令。构建镜像时,Docker的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有心的镜像使用FROM指令指定父镜像为这个镜像时,便会触发执行。
• 使用FROM以这个Dockerfile构建出的镜像为父镜像,构建子镜像时:
• ONBUILD ADD . /app/src:自动执行ADD . /app/src
5.4 把本地镜像上传到华为云镜像仓库
华为云Docker镜像仓库SWR服务,在它的界面有提示你如何把本地的镜像提交到云上。
6 华为云容器团队帮忙制作
如果客户已经存在一定业务量,或者开始POC,可提供适当的免费制作服务。
如果制作镜像需求上量后,可提供培训课程关于如何制作Docker镜像。并收取一定的合理费用。
- 点赞
- 收藏
- 关注作者
评论(0)